#include <iostream>
#include <string>
#include <cstdio>
#include <unistd.h>
#include <pthread.h>

using namespace std;

//枚举状态：正常运行与已退出
enum { OK, EXIT };

class ThreadData
{
public:
    ThreadData(const string& name, int id, time_t createTime, int top)
        :_name(name), _id(id), _createTime(createTime), _top(top), _status(OK), _result(0)
    {}

public:
    string _name;
    int _id;
    time_t _createTime;   //创建时间
    int _top;   //资源
    int _status; //状态
    int _result;    //结果
};

pthread_t id = 0;

void *threadRun(void *arg)
{
    //完成任务：计算累加和
    cout << "当前线程的 id 为：" << pthread_self() << endl; 

    //可以关闭
    cout << "准备尝试关闭主线程" << endl;
    sleep(3);
    pthread_cancel(id);


    ThreadData* td = static_cast<ThreadData*>(arg);

    for(int i = 1; i <= td->_top; i++)
        td->_result += i;

    cout << td->_name << " | " << td->_id << " call done!" << endl;
    td->_status = EXIT;
    pthread_exit((void*)td);
}

int main()
{
    //获取主线程的id
    id = pthread_self();
    //创建一批线程
    pthread_t thread_arr[64] = { 0 };
    for(int i = 0; i < 5; i++)
    {
        char* buff = new char[64];  //缓冲区 ---> 不能使用同一份资源
        snprintf(buff, 64, "thread %d", i);
        ThreadData* td = new ThreadData(buff, i + 1, time(nullptr), 100 * (i + 1));
        pthread_create(&thread_arr[i], nullptr, threadRun, static_cast<void*> (td));
        sleep(10);
    }

    void* retval = nullptr;
    for(int i = 0; i < 5; i++)
    {
        //等待次线程结束
       int ret = pthread_join(thread_arr[i], &retval);
       if(ret != 0) { cout << "回收 " << i << " 失败" << endl; }
       else 
       {
        ThreadData* td = static_cast<ThreadData*>(retval);
        cout << td->_name << " 已回收，创建时间为：" << td->_createTime << endl;
        cout << "状态：" << td->_status << " 计算结果：" << td->_result << endl;
       }
    }

    cout << "All Thread done!" << endl;

    return 0;    
}

// void *threadRun(void *arg)
// {
//     //运行五秒后退出
//     int n = 5;
//     char* str = (char*) arg;
//     while(n--)
//     {
//         cout << "threadRun~ info: " << str << endl;
//         sleep(1);
//     }
    
//     cout << (char*)arg << " exit!" << endl;
//     delete[] (char*)arg;
//     pthread_exit((void*)668);
//     //return (void*)0;
// }

// int main()
// {
//     //创建一批线程
//     pthread_t thread_arr[64] = { 0 };
//     for(int i = 0; i < 5; i++)
//     {
//         char* buff = new char[64];  //缓冲区 ---> 不能使用同一份资源
//         //char buff[64] = { 0 };  //缓冲区 ---> 不能使用同一份资源
//         snprintf(buff, 64, "thread %d", i);
//         pthread_create(&thread_arr[i], nullptr, threadRun, (void*)buff);
//         sleep(1);
//     }

//     void* retval = nullptr;
//     for(int i = 0; i < 5; i++)
//     {
//         //等待次线程结束
//        int ret = pthread_join(thread_arr[i], &retval);
//        cout << "retval: " << (uint64_t)retval << endl;
//        if(ret != 0) 
//        {
//         cout << "回收 " << i << " 失败" << endl;
//        }
//        else
//        {
//         cout << "回收成功，释放 new 出来的空间" << endl;
//        }
//     }

//     // pthread_t p;
//     // pthread_create(&p, nullptr, threadRun, nullptr);

//     //sleep(5);

//     //pthread_exit(nullptr);    //假如次线程在运行时，终止主进程，那么此时程序不会结束，因为当前进程中仍然有执行流

//     // while(true)
//     // {
//     //     cout << "main run" << endl;
//     //     sleep(1);
//     // }

//     return 0;    
// }